#include <Arduino.h>
#include "voiceSu03t.h"

//语音识别模块定义
#define VOICE_PORT 1            //语音识别模块使用的串口
#define VOICE_TX_PIN 12         //语音识别模块使用的串口TX引脚
#define VOICE_RX_PIN 13         //语音识别模块使用的串口RX引脚
#define VOICE_TX_BAUDRATE 9600  //语音识别模块使用的串口波特率

//创建语音识别对象
VOICESU03T Su03t(VOICE_PORT, VOICE_TX_PIN, VOICE_RX_PIN, VOICE_TX_BAUDRATE); 
char su03t_rx_buff[20];
char su03t_rx_len;

//虚拟温湿度数据
int temperature = 26;
int humidity = 70;

//虚拟时间数据
int hour = 12;
int minute = 59;

/* 语音表
帧头    数据    帧尾    说明
EF      00      FE      被语音唤醒，唤醒词：小豆小豆|小豆同学|你好小豆
EF      01      FE      识别到语音：当前温湿度|现在温湿度|现在的温湿度|温湿度是多少  
EF      02      FE      识别到语音：当前时间|现在时间|现在的时间|现在是什么时候了|现在多少点了|现在时间是多少|报时
EF      03      FE      识别到语音：显示时间|切换时间界面|切换时间|显示时钟|切换时钟界面|切换时钟
EF      04      FE      识别到语音：显示天气|切换天气|切换天气界面|显示天气界面 
EF      05      FE      识别到语音：显示温湿度|切换温湿度|切换温湿度界面|显示温湿度界面
EF      06      FE      识别到语音：显示数字雨|切换数字雨|切换数字雨界面|显示数字雨界面
EF      07      FE      识别到语音：显示频谱灯|显示音律灯|切换频谱灯|切换音律灯|切换频谱灯界面|切换音频灯界面|显示频谱灯界面|显示音律灯界面
EF      08      FE      识别到语音：显示切换|切屏|界面切换|切换界面|显示下一个
 */
void voiceAnalysis(char* rx_buff)
{
  if( rx_buff[0] == 0XEF )
  {
      if( rx_buff[2] == 0xFE )
      {
          Su03t.setState(rx_buff[1]); //接收语音模块格式帧的关键数据

          switch (rx_buff[1])
          {
          case 0x01://当前温湿度|现在温湿度|现在的温湿度|温湿度是多少         
           Su03t.voiceSpeechHumiture(temperature,humidity); 
            break;
          case 0x02://当前时间|现在时间|现在的时间|现在是什么时候了|现在多少点了|现在时间是多少|报时            
            Su03t.voiceSpeechTime(hour,minute); 
            break;
          case 0x03://显示时间|切换时间界面|切换时间|显示时钟|切换时钟界面|切换时钟
             Serial.printf("显示时间界面");  
            break;
          case 0x04://显示天气|切换天气|切换天气界面|显示天气界面            
            Serial.printf("显示天气界面");  
            break;
          case 0x05://显示温湿度|切换温湿度|切换温湿度界面|显示温湿度界面    
            Serial.printf("显示温湿度界面");          
            break;
          case 0x06://显示数字雨|切换数字雨|切换数字雨界面|显示数字雨界面    
            Serial.printf("显示数字雨界面");        
            break;
          case 0x07://显示频谱灯|显示音律灯|切换频谱灯|切换音律灯|切换频谱灯界面|切换音频灯界面|显示频谱灯界面|显示音律灯界面  
            Serial.printf("显示频谱灯界面");                
            break;
          case 0x08://显示切换|切屏|界面切换|切换界面|显示下一个            
            Serial.printf("界面切换");   
            break;
           
          default:
            break;
          }
      }
  }
}

// 定义一个语音识别串口的中断服务函数
void voiceSerialReceive() 
{
  // 当有数据到达时，此函数会被调用
  while (Su03t.available()) 
  {
      // 读取数据
      su03t_rx_buff[su03t_rx_len++] = Su03t.read();
      
      if( su03t_rx_len >= 3 ) //如果数据长度超过要求
      {
          voiceAnalysis(su03t_rx_buff); //数据解析并执行对应功能
          for(int i=0;i<10;i++)su03t_rx_buff[i] = 0;//清除接收的数据
          su03t_rx_len = 0;//接收数据的长度清零
      }
  }
}


void setup() 
{
  Serial.begin(9600);               //调试串口初始化
  Su03t.begin();                    //语音模块串口初始化
}

void loop() 
{
  delay(50);
}

